package com.rover.system.service;

import com.common.Common;
import com.grid.DataGrid;
import com.grid.Page;
import com.rover.system.entity.Code;
import com.rover.system.entity.CodeValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service("codeService")
@Transactional
public class CodeService extends BaseService {
	protected Logger logger = LoggerFactory.getLogger(getClass());

	@Transactional(readOnly = true)
	public DataGrid query(Page page) throws Exception {
		DataGrid dataGrid = new DataGrid();
		List<Code> li = dao.<Code> findPageHql(page.getHQL(),
				page.getWhereParams(), page.getPageNo(), page.getPageSize());
		for (Code code : li)
			code.setCodeValue(null);
		dataGrid.setResult(li);
		dataGrid.setTotalCount(dao.countHql(page.getHQLTotalCount(),
				page.getWhereParams()));
		return dataGrid;
	}

	@Transactional
	public void initData() {
		Code code = null;
		// 产品分类
		if (getCodeIdSpareProperty("productCategories") == null) {
			code = new Code();
			code.setIsTree(1);
			code.setDescription("产品分类");
			code.setName("产品分类");
			code.setSpareProperty("productCategories");
			save(code);
		}
		// 回款记录 --> 期次
		saveInitValue("期次", "1;2;3;4;5;6;7;8;9;10;11;12");

		// 回款记录 --> 已开发票
		saveInitValue("已开发票", "是;否;无需发票");

		// 回款记录 -->付款方式
		saveInitValue("付款方式", "支票;现金;邮政汇款;电汇;网上银行;其它");

		// 回款记录 --> 回款记录分类
		saveInitValue("回款记录分类", "新客户付款;老客户付款;押金;贷款;服务费");

		// 合同状态
		saveInitValue("合同状态", "进行中;成功;意外终止");

		// 潜在客户状态
		saveInitValue("潜在客户状态", "已联系;未处理;合格;不合格;已转换");

		// 来源
		saveInitValue("来源", "电话来访;客户介绍;独立开发;媒体宣传;促销活动;老客户;代理商;公开招标;互联网;其它");

		//行业
		saveInitValue("行业", "农业;服装;银行;生物技术;化学;通讯;建筑;咨询;教育;电子;能源;工程;娱乐;环境;金融;食品与饮料;政府;卫生保健;酒店;保险;机械;制造业;媒体;非盈利事业;休闲娱乐;零售;航运;技术;其它");
	}

	// 保存初始化值
	private void saveInitValue(String codeName, String codeValues) {
		Code code = new Code();
		code.setIsTree(0);
		code.setDescription(codeName);
		code.setName(codeName);
		save(code);
		CodeValue codeValue = null;
		String[] strValues = codeValues.split(";");
		for (int i = 0; i < strValues.length; i++) {
			codeValue = new CodeValue();
			codeValue.setItemValue(String.valueOf(i + 1));
			codeValue.setItemText(strValues[i]);
			codeValue.setCode(code);
			save(codeValue);
		}
	}

	/**
	 * 对数据字典进行缓存
	 */
	@Transactional(readOnly = true)
	public void initAllCode() {
		Code.allCode.clear();
		Code.allCodeValue.clear();
		List<Code> list = this.dao.findHql(
				"from Code where spareProperty is null", null);
		List<CodeValue> listCodeValue = null;
		CodeValue codeValue = null;
		for (Code code : list) {
			listCodeValue = new ArrayList<CodeValue>();
			for (CodeValue cv : code.getCodeValue()) {
				codeValue = new CodeValue();
				codeValue.setItemText(cv.getItemText());
				codeValue.setItemValue(cv.getItemValue());
				listCodeValue.add(codeValue);
			}
			Code.allCodeValue.put(code.getName(), listCodeValue);
		}
		// 是否
		listCodeValue = new ArrayList<CodeValue>();
		for (Common.是否 text : Common.是否.values()) {
			codeValue = new CodeValue();
			codeValue.setItemText(text.toString());
			codeValue.setItemValue(text.getValue());
			listCodeValue.add(codeValue);
		}
		Code.allCodeValue.put(Common.是否.class.getSimpleName(), listCodeValue);
		// 活动相关项
		listCodeValue = new ArrayList<CodeValue>();
		for (Common.活动相关项 text : Common.活动相关项.values()) {
			codeValue = new CodeValue();
			codeValue.setItemText(text.toString());
			codeValue.setItemValue(text.getValue());
			listCodeValue.add(codeValue);
		}
		Code.allCodeValue
				.put(Common.活动相关项.class.getSimpleName(), listCodeValue);

		// 票据类型
		listCodeValue = new ArrayList<CodeValue>();
		for (Common.票据类型 text : Common.票据类型.values()) {
			codeValue = new CodeValue();
			codeValue.setItemText(text.toString());
			codeValue.setItemValue(text.getValue());
			listCodeValue.add(codeValue);
		}
		Code.allCodeValue.put(Common.票据类型.class.getSimpleName(), listCodeValue);

		// 回款计划
		listCodeValue = new ArrayList<CodeValue>();
		for (Common.回款计划 text : Common.回款计划.values()) {
			codeValue = new CodeValue();
			codeValue.setItemText(text.toString());
			codeValue.setItemValue(text.getValue());
			listCodeValue.add(codeValue);
		}
		Code.allCodeValue.put(Common.回款计划.class.getSimpleName(), listCodeValue);
	}

	/*
	 * 添加的时候判断名称是否重复
	 * 
	 * @name 要判断的名称
	 */
	public Boolean isAddNameRepeat(String name) {
		String hql = "select count(id) from Code where name=:name";
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("name", name);
		if (dao.countHql(hql, params) > 0) {
			return true;
		} else
			return false;
	}

	/*
	 * 根据id获取编码名称
	 * 
	 * @name id
	 */
	public String getName(Long id) {
		String hql = "select name from Code where id=:id";
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("id", id);
		return (String) dao.uniqueResultHql(hql, params);
	}

	/*
	 * 编辑的时候判断名称是否重复
	 * 
	 * @name 要判断的名称
	 */
	public Boolean isEditNameRepeat(Integer id, String name) {
		String hql = "select count(id) from Code where id<>:id and name=:name";
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("id", id);
		params.put("name", name);
		if (dao.countHql(hql, params) > 0) {
			return true;
		} else
			return false;
	}

	/*
	 * 名称
	 * 
	 * @name spareProperty
	 */
	public Code getEntitySpareProperty(String spareProperty) {
		String hql = "from Code where spareProperty=:spareProperty";
		return this.findUniqueByProperty(Code.class, "spareProperty",
				spareProperty);
	}

	/*
	 * 根据spareProperty获取CodeId
	 * 
	 * @name spareProperty
	 */
	public Integer getCodeIdSpareProperty(String spareProperty) {
		String hql = "select id from Code where spareProperty=:spareProperty";
		Map<String, Object> mapParam = new HashMap<String, Object>();
		mapParam.put("spareProperty", spareProperty);
		return (Integer) dao.uniqueResultHql(hql, mapParam);
	}
}
